gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/Test/SkinWnd.cpp

    // SkinWnd.cpp : 实现文件
//

#include "stdafx.h"
#include "SkinWnd.h"

IMPLEMENT_DYNAMIC(CSkinWnd, CSkinUIWnd)

BEGIN_MESSAGE_MAP(CSkinWnd, CSkinUIWnd)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

CSkinWnd::CSkinWnd()
{
	m_pbtnClose = NULL;
	m_pbtnMin = NULL;
	m_pbtnOk = NULL;
	m_pbtnCancel = NULL;

	m_pText = NULL;
	m_pButton = NULL;
	m_pHyperLink = NULL;
	m_pGroupBox = NULL;
	m_pCheckBox = NULL;
	m_pRadio1 = NULL;
	m_pRadio2 = NULL;
	m_pProgress = NULL;
	m_pSlider = NULL;
	m_pSlider2 = NULL;
	m_pSlider3 = NULL;
	m_pTxtH = NULL;
	m_pTxtS = NULL;
	m_pTxtL = NULL;

	LoadImageResource();
}

CSkinWnd::~CSkinWnd()
{
	SafeDelete(m_pbtnClose);
	SafeDelete(m_pbtnMin);
	SafeDelete(m_pbtnOk);
	SafeDelete(m_pbtnCancel);

	SafeDelete(m_pText);
	SafeDelete(m_pButton);
	SafeDelete(m_pHyperLink);
	SafeDelete(m_pGroupBox);
	SafeDelete(m_pCheckBox);
	SafeDelete(m_pRadio1);
	SafeDelete(m_pRadio2);
	SafeDelete(m_pProgress);
	SafeDelete(m_pSlider);
	SafeDelete(m_pSlider2);
	SafeDelete(m_pSlider3);
	SafeDelete(m_pTxtH);
	SafeDelete(m_pTxtS);
	SafeDelete(m_pTxtL);
}

void CSkinWnd::LoadImageResource()
{
	m_ImageWndTL.Load(_T("Res\\SkinWnd\\wnd_tl.png"), CXIMAGE_FORMAT_PNG);
	m_ImageWndTM.Load(_T("Res\\SkinWnd\\wnd_tm.png"), CXIMAGE_FORMAT_PNG);
	m_ImageWndTR.Load(_T("Res\\SkinWnd\\wnd_tr.png"), CXIMAGE_FORMAT_PNG);
	m_ImageWndML.Load(_T("Res\\SkinWnd\\wnd_ml.png"), CXIMAGE_FORMAT_PNG);
	m_ImageWndMR.Load(_T("Res\\SkinWnd\\wnd_mr.png"), CXIMAGE_FORMAT_PNG);
	m_ImageWndBL.Load(_T("Res\\SkinWnd\\wnd_bl.png"), CXIMAGE_FORMAT_PNG);
	m_ImageWndBM.Load(_T("Res\\SkinWnd\\wnd_bm.png"), CXIMAGE_FORMAT_PNG);
	m_ImageWndBR.Load(_T("Res\\SkinWnd\\wnd_br.png"), CXIMAGE_FORMAT_PNG);

	m_ImageBg.Load(_T("Res\\Test\\bg.jpg"), CXIMAGE_FORMAT_JPG);
}

//创建区域
void CSkinWnd::CreateWndRgn()
{
	CRect rcRect;
	GetClientRect(&rcRect);
	CRgn rgnWnd;
	rgnWnd.CreateRectRgn(0,0,0,0);

	CRgn rgnTL, rgnTR, rgnBL, rgnBR;
	GetImageRgn(rgnTL, &m_ImageWndTL);
	GetImageRgn(rgnTR, &m_ImageWndTR);
	GetImageRgn(rgnBL, &m_ImageWndBL);
	GetImageRgn(rgnBR, &m_ImageWndBR);

	CRgn rgnTM;
	rgnTM.CreateRectRgn(m_ImageWndTL.GetWidth(), 0, rcRect.right - m_ImageWndTR.GetWidth(), m_ImageWndTR.GetHeight());
	rgnWnd.CombineRgn(&rgnTL, &rgnTM, RGN_OR);
	rgnTR.OffsetRgn(rcRect.right-m_ImageWndTR.GetWidth(), 0);
	rgnWnd.CombineRgn(&rgnWnd, &rgnTR,RGN_OR);
	CRgn rgnM;
	rgnM.CreateRectRgn(0, m_ImageWndTR.GetHeight(), rcRect.Width(), rcRect.bottom-m_ImageWndBR.GetHeight());
	rgnWnd.CombineRgn(&rgnWnd, &rgnM, RGN_OR);
	rgnBL.OffsetRgn(0, rcRect.bottom-m_ImageWndBL.GetHeight());
	rgnWnd.CombineRgn(&rgnWnd, &rgnBL, RGN_OR);
	CRgn rgnBM;
	rgnBM.CreateRectRgn(m_ImageWndBL.GetWidth(), rcRect.bottom-m_ImageWndBL.GetHeight(), rcRect.right-m_ImageWndBR.GetWidth(), rcRect.bottom);
	rgnWnd.CombineRgn(&rgnWnd, &rgnBM, RGN_OR);
	rgnBR.OffsetRgn(rcRect.right-m_ImageWndBR.GetWidth(), rcRect.bottom-m_ImageWndBR.GetHeight());
	rgnWnd.CombineRgn(&rgnWnd, &rgnBR, RGN_OR);

	SetWindowRgn(rgnWnd,TRUE);
}

int CSkinWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (__super::OnCreate(lpCreateStruct) == -1) return -1;

	m_pbtnClose = new CSkinUIButton;
	m_pbtnClose->CreateControl(_T("btn_close"), this, CRect(0,0,0,0));
	m_pbtnClose->SetImage(_T("Res\\Common\\btn_close.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pbtnClose);

	m_pbtnMin = new CSkinUIButton;
	m_pbtnMin->CreateControl(_T("btn_min"), this, CRect(0,0,0,0));
	m_pbtnMin->SetImage(_T("Res\\Common\\btn_min.png"), CXIMAGE_FORMAT_PNG, true);
	AddControl(m_pbtnMin);

	m_pbtnOk = new CSkinUIButton;
	m_pbtnOk->CreateControl(_T("btn_ok"), this, CRect(0,0,0,0), _T("确定"));
	m_pbtnOk->SetImage(_T("Res\\Common\\btn_back.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pbtnOk);

	m_pbtnCancel = new CSkinUIButton;
	m_pbtnCancel->CreateControl(_T("btn_cancel"), this, CRect(0,0,0,0), _T("取消"));
	m_pbtnCancel->SetImage(_T("Res\\Common\\btn_back.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pbtnCancel);

	m_pText = new CSkinUIText;
	m_pText->CreateControl(_T("text"), this, CRect(0,0,0,0), _T("测试文字控件"));
	AddControl(m_pText);

	m_pButton = new CSkinUIButton;
	m_pButton->CreateControl(_T("button"), this, CRect(0, 0, 0, 0));
	m_pButton->SetImage(_T("Res\\test\\Jeton.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pButton);

	m_pHyperLink = new CSkinUIHyperLink;
	m_pHyperLink->CreateControl(_T("hyperlink"), this, CRect(0, 0, 0, 0), _T("测试超链接"));
	AddControl(m_pHyperLink);

	m_pGroupBox = new CSkinUIGroupBox;
	m_pGroupBox->CreateControl(_T("groupbox"), this, CRect(0, 0, 0, 0), _T("测试组合框"));
	AddControl(m_pGroupBox);

	m_pCheckBox = new CSkinUICheckBox;
	m_pCheckBox->CreateControl(_T("checkbox"), this, CRect(0, 0, 0, 0), _T("测试复选框"));
	m_pCheckBox->SetImage(_T("Res\\Common\\check.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pCheckBox);

	m_pRadio1 = new CSkinUIRadioBox;
	m_pRadio1->CreateControl(_T("radiobox1"), this, CRect(0, 0, 0, 0), _T("测试单选框1"));
	m_pRadio1->SetImage(_T("Res\\Common\\radio.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pRadio1);
	m_pRadio1->SetCheck();

	m_pRadio2 = new CSkinUIRadioBox;
	m_pRadio2->CreateControl(_T("radiobox2"), this, CRect(0, 0, 0, 0), _T("测试单选框2"));
	m_pRadio2->SetImage(_T("Res\\Common\\radio.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pRadio2);
	//m_pRadio2->SetGroup(1);

	m_pProgress = new CSkinUIProgress;
	m_pProgress->CreateControl(_T("progress"), this, CRect(0, 0, 0, 0));
	m_pProgress->SetBgImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG);
	m_pProgress->SetProgressImage(_T("Res\\test\\luminance.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pProgress);
	m_pProgress->SetValue(50);

	m_pSlider = new CSkinUISlider;
	m_pSlider->CreateControl(_T("slider1"), this, CRect(0, 0, 0, 0));
	m_pSlider->SetBgImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG);
	m_pSlider->SetProgressImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG);
	m_pSlider->SetThumbImage(_T("Res\\test\\thumb.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pSlider);
	m_pSlider->SetRange(-180, 180);
	m_pSlider->SetValue(0);

	m_pTxtH = new CSkinUIText;
	m_pTxtH->CreateControl(_T("h"), this, CRect(0,0,0,0), _T("色调"));
	AddControl(m_pTxtH);

	m_pSlider2 = new CSkinUISlider;
	m_pSlider2->CreateControl(_T("slider2"), this, CRect(0, 0, 0, 0));
	m_pSlider2->SetBgImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG);
	m_pSlider2->SetProgressImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG);
	m_pSlider2->SetThumbImage(_T("Res\\test\\thumb.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pSlider2);
	m_pSlider2->SetRange(0, 200);
	m_pSlider2->SetValue(100);

	m_pTxtS = new CSkinUIText;
	m_pTxtS->CreateControl(_T("S"), this, CRect(0,0,0,0), _T("饱和度"));
	AddControl(m_pTxtS);

	m_pSlider3 = new CSkinUISlider;
	m_pSlider3->CreateControl(_T("slider3"), this, CRect(0, 0, 0, 0));
	m_pSlider3->SetBgImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG);
	m_pSlider3->SetProgressImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG);
	m_pSlider3->SetThumbImage(_T("Res\\test\\thumb.png"), CXIMAGE_FORMAT_PNG);
	AddControl(m_pSlider3);
	m_pSlider3->SetRange(-5, 5);
	m_pSlider3->SetValue(0);

	m_pTxtL = new CSkinUIText;
	m_pTxtL->CreateControl(_T("L"), this, CRect(0,0,0,0), _T("亮度"));
	AddControl(m_pTxtL);

	SetWindowPos(NULL, 0,0, 500, 500, SWP_NOMOVE);

	return 0;
}

void CSkinWnd::OnSize(UINT nType, int cx, int cy)
{
	__super::OnSize(nType, cx, cy);

	CRect rcClient;
	GetClientRect(&rcClient);

	CreateWndRgn();

	m_pbtnClose->SetPos(rcClient.right - m_pbtnClose->GetWidth() - 10, 0, -1, -1);
	m_pbtnMin->SetPos(rcClient.right - m_pbtnClose->GetWidth() - 10 - 27, 0, 27, 22);
	m_pbtnCancel->SetPos(rcClient.right - m_pbtnCancel->GetWidth() -  10, rcClient.bottom - m_pbtnCancel->GetHeight() - 5, -1, -1);
	m_pbtnOk->SetPos(rcClient.right - 2 * m_pbtnCancel->GetWidth() -  10, rcClient.bottom - m_pbtnCancel->GetHeight() - 5, -1, -1);

	m_pText->SetPos(50, 50, 80, 12);
	m_pButton->SetPos(150, 50, -1, -1);
	m_pHyperLink->SetPos(230, 50, 80, 12);
	m_pGroupBox->SetPos(20, 35, 440, 400);
	m_pCheckBox->SetPos(350, 50, 80, 16);
	m_pRadio1->SetPos(50, 150, 100, 16);
	m_pRadio2->SetPos(150, 150, 100, 16);
	m_pProgress->SetPos(300, 150, 119, 6);
	m_pSlider->SetPos(200, 180, 119, 6);
	m_pSlider2->SetPos(200, 220, 119, 6);
	m_pSlider3->SetPos(200, 270, 119, 6);
	m_pTxtH->SetPos(150, 180, 50, 12);
	m_pTxtS->SetPos(150, 220, 50, 12);
	m_pTxtL->SetPos(150, 270, 50, 12);

	UINT uFlag = SWP_NOZORDER | SWP_NOCOPYBITS;
	HDWP hDwp = BeginDeferWindowPos(32);
	EndDeferWindowPos(hDwp);

	Invalidate(FALSE);
	UpdateWindow();
}

void CSkinWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
	__super::OnLButtonDown(nFlags, point);

	//模拟按标题
	if (point.y < (int)m_ImageWndTM.GetHeight())
		PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
}

//绘画背景
void CSkinWnd::PaintBackGround(CDC * pDC, int nWidth, int nHeight)
{
	//背景
	pDC->FillSolidRect(0, 0, nWidth, nHeight, RGB(255,255,255));

	//四周
	m_ImageWndTL.Draw(pDC->m_hDC, 0, 0);
	for (DWORD x = m_ImageWndTL.GetWidth(); x <= nWidth - m_ImageWndTR.GetWidth(); x += m_ImageWndTM.GetWidth())
	{
		m_ImageWndTM.Draw(pDC->m_hDC, x, 0);
	}
	m_ImageWndTR.Draw(pDC->m_hDC, nWidth - m_ImageWndTR.GetWidth(), 0);

	for (DWORD y = m_ImageWndTL.GetHeight(); y <= nHeight - m_ImageWndBL.GetHeight(); y += m_ImageWndML.GetHeight())
	{
		m_ImageWndML.Draw(pDC->m_hDC, 0, y);
	}

	for (DWORD y = m_ImageWndTR.GetHeight(); y <= nHeight - m_ImageWndBR.GetHeight(); y += m_ImageWndMR.GetHeight())
	{
		m_ImageWndMR.Draw(pDC->m_hDC, nWidth - m_ImageWndMR.GetWidth(), y);
	}

	m_ImageWndBL.Draw(pDC->m_hDC, 0, nHeight - m_ImageWndBL.GetHeight());
	for (DWORD x = m_ImageWndBL.GetWidth(); x <= nWidth - m_ImageWndBR.GetWidth(); x += m_ImageWndBM.GetWidth())
	{
		m_ImageWndBM.Draw(pDC->m_hDC, x, nHeight - m_ImageWndBL.GetHeight());
	}
	m_ImageWndBR.Draw(pDC->m_hDC, nWidth - m_ImageWndBR.GetWidth(), nHeight - m_ImageWndBL.GetHeight());

	//标题
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(64,64,64));
	CFont font;
	font.CreateFont(-12,0,0,0,700,0,0,0,134,3,2,1,2,TEXT("宋体"));
	pDC->SelectObject(&font);
	CString strTitle;
	GetWindowText(strTitle);
	CRect rcTitle;
	rcTitle.left = 18;
	rcTitle.right = nWidth;
	rcTitle.top = 2;
	rcTitle.bottom = rcTitle.top + 24;
	pDC->DrawText(strTitle, &rcTitle, DT_LEFT | DT_VCENTER | DT_SINGLELINE);

	m_ImageBg.Draw(pDC->m_hDC, 40, 55, 400, 400);
}

void CSkinWnd::LButtonClickListener(const CString & strName)
{
	if (strName == _T("btn_close"))
	{
		DestroyWindow();
	}
	else if (strName == _T("btn_min"))
	{
		ShowWindow(SW_MINIMIZE);
	}
	else if (strName == _T("btn_ok"))
	{
		DestroyWindow();
	}
	else if (strName == _T("btn_cancel"))
	{
		DestroyWindow();
	}
	else if (strName == _T("button"))
	{
		MessageBox(_T("button"));
	}
	else if (strName == _T("hyperlink"))
	{
		MessageBox(_T("hyperlink"));
	}
	else if (strName == _T("checkbox"))
	{
		if (m_pCheckBox->GetCheck())
			MessageBox(_T("check"));
		else
			MessageBox(_T("uncheck"));
	}
}

void CSkinWnd::MouseMoveListener(const CString & strName)
{
	if (strName == _T("slider1"))
	{
		BYTE hue = (BYTE)m_pSlider->GetValue();
		BYTE sat = (BYTE)m_pSlider2->GetValue();
		m_ImageWndTL.Colorize(hue, sat);
		m_ImageWndTM.Colorize(hue, sat);
		m_ImageWndTR.Colorize(hue, sat);
		m_ImageWndML.Colorize(hue, sat);
		m_ImageWndMR.Colorize(hue, sat);
		m_ImageWndBL.Colorize(hue, sat);
		m_ImageWndBM.Colorize(hue, sat);
		m_ImageWndBR.Colorize(hue, sat);
		Invalidate(FALSE);
	}
	else if (strName == _T("slider2"))
	{
		BYTE hue = (BYTE)m_pSlider->GetValue();
		BYTE sat = (BYTE)m_pSlider2->GetValue();
		m_ImageWndTL.Colorize(hue, sat);
		m_ImageWndTM.Colorize(hue, sat);
		m_ImageWndTR.Colorize(hue, sat);
		m_ImageWndML.Colorize(hue, sat);
		m_ImageWndMR.Colorize(hue, sat);
		m_ImageWndBL.Colorize(hue, sat);
		m_ImageWndBM.Colorize(hue, sat);
		m_ImageWndBR.Colorize(hue, sat);
		Invalidate(FALSE);
	}
	else if (strName == _T("slider3"))
	{
		//亮度不怎么好调
		long l = m_pSlider3->GetValue();
		m_ImageWndTL.Light(l, 0);
		m_ImageWndTM.Light(l, 0);
		m_ImageWndTR.Light(l, 0);
		m_ImageWndML.Light(l, 0);
		m_ImageWndMR.Light(l, 0);
		m_ImageWndBL.Light(l, 0);
		m_ImageWndBM.Light(l, 0);
		m_ImageWndBR.Light(l, 0);
		Invalidate(FALSE);
	}
}